package page

import (
	"blog/model"
	"blog/service/data"
	"math"

	"github.com/gin-gonic/gin"
)

type PostPageService struct {
	postDataService *data.PostDataService
	typeDataService *data.TypeDataService
	tagDataService  *data.TagDataService
}

func NewPostPageService() *PostPageService {
	return &PostPageService{
		postDataService: &data.PostDataService{},
		typeDataService: &data.TypeDataService{},
		tagDataService:  &data.TagDataService{},
	}
}

// GetPostList 获取文章列表（页面逻辑）
func (s *PostPageService) GetPostList(ctx *gin.Context, page, pageSize int) (*model.PostListData, error) {
	// 调用数据层获取原始数据
	posts, total, err := s.postDataService.GetPostList(ctx, page, pageSize)
	if err != nil {
		return nil, err
	}

	// 页面层处理数据转换
	postDataMap := make(map[int64]model.PostDataSimple)
	for _, post := range posts {
		// 获取文章类型信息
		postTypeInfo := s.typeDataService.GetPostTypeInfo(ctx, post.PostType)
		// 获取文章标签
		tags := s.tagDataService.GetPostTags(ctx, int(post.ID))
		tagNames := make([]string, 0)
		for _, tag := range tags {
			tagNames = append(tagNames, tag.Name)
		}
		postDataMap[post.ID] = model.PostDataSimple{
			ID:         post.ID,
			Title:      post.Title,
			Content:    post.Content,
			TypeID:     post.PostType,
			TypeName:   postTypeInfo.Name,
			Tags:       tagNames,
			ReadCount:  post.ReadNum,
			CreateTime: post.AddTime,
		}
	}

	pageNum := int(math.Ceil(float64(total) / float64(pageSize)))

	return &model.PostListData{
		Lists:       postDataMap,
		PageNum:     pageNum,
		DataNum:     int(total),
		CurrentPage: page,
		PageSize:    pageSize,
	}, nil
}

// GetPostByID 根据ID获取文章（页面逻辑）
func (s *PostPageService) GetPostByID(ctx *gin.Context, id int64) (*model.Post, error) {
	// 调用数据层获取文章
	post, err := s.postDataService.GetPostByID(ctx, id)
	if err != nil {
		return nil, err
	}

	// 页面层处理：增加阅读量
	if err := s.postDataService.IncrementReadCount(ctx, id); err != nil {
		// 记录错误但不影响文章显示
		// log.Error("Failed to increment read count", zap.Error(err))
	}

	return post, nil
}

// GetNewPosts 获取最新文章（页面逻辑）
func (s *PostPageService) GetNewPosts(ctx *gin.Context, limit int) ([]model.NewPostList, error) {
	// 直接调用数据层
	return s.postDataService.GetNewPosts(ctx, limit)
}

// SearchPosts 搜索文章（页面逻辑）
func (s *PostPageService) SearchPosts(ctx *gin.Context, keyword string, page, pageSize int) (*model.PostListData, error) {
	// 调用数据层获取搜索结果
	posts, total, err := s.postDataService.SearchPosts(ctx, keyword, page, pageSize)
	if err != nil {
		return nil, err
	}

	// 页面层处理数据转换
	postDataMap := make(map[int64]model.PostDataSimple)
	for _, post := range posts {
		// 获取文章类型信息
		postTypeInfo := s.typeDataService.GetPostTypeInfo(ctx, post.PostType)
		// 获取文章标签
		tags := s.tagDataService.GetPostTags(ctx, int(post.ID))
		tagNames := make([]string, 0)
		for _, tag := range tags {
			tagNames = append(tagNames, tag.Name)
		}
		postDataMap[post.ID] = model.PostDataSimple{
			ID:         post.ID,
			Title:      post.Title,
			Content:    post.Content,
			TypeID:     post.PostType,
			TypeName:   postTypeInfo.Name,
			Tags:       tagNames,
			ReadCount:  post.ReadNum,
			CreateTime: post.AddTime,
		}
	}

	pageNum := int(math.Ceil(float64(total) / float64(pageSize)))

	return &model.PostListData{
		Lists:       postDataMap,
		PageNum:     pageNum,
		DataNum:     int(total),
		CurrentPage: page,
		PageSize:    pageSize,
	}, nil
}

// CreatePost 创建文章（页面逻辑）
func (s *PostPageService) CreatePost(ctx *gin.Context, post *model.Post) error {
	// 页面层处理：数据验证等
	if post.Title == "" {
		return model.ERR_POST_TITLE_ERROR
	}
	if post.Content == "" {
		return model.ERR_POST_CONTENT_ERROR
	}

	// 调用数据层创建文章
	return s.postDataService.CreatePost(ctx, post)
}

// UpdatePost 更新文章（页面逻辑）
func (s *PostPageService) UpdatePost(ctx *gin.Context, post *model.Post) error {
	// 页面层处理：数据验证等
	if post.Title == "" {
		return model.ERR_POST_TITLE_ERROR
	}
	if post.Content == "" {
		return model.ERR_POST_CONTENT_ERROR
	}

	// 调用数据层更新文章
	return s.postDataService.UpdatePost(ctx, post)
}

// DeletePost 删除文章（页面逻辑）
func (s *PostPageService) DeletePost(ctx *gin.Context, id int64) error {
	// 页面层处理：权限验证等
	// 这里可以添加权限检查逻辑

	// 调用数据层删除文章
	return s.postDataService.DeletePost(ctx, id)
}

// GetPostInfoForRead 获取文章信息用于阅读页面（页面逻辑）
func (s *PostPageService) GetPostInfoForRead(ctx *gin.Context, id int64) (data.PostData, error) {
	// 调用数据层获取文章信息
	postData, err := s.postDataService.GetPostInfo(ctx, id, false)
	if err != nil {
		return data.PostData{}, err
	}

	// 页面层处理：增加阅读量
	if err := s.postDataService.IncrementReadCount(ctx, id); err != nil {
		// 记录错误但不影响文章显示
		// log.Error("Failed to increment read count", zap.Error(err))
	}

	return postData, nil
}

// GetPostListForIndex 获取首页文章列表（页面逻辑）
func (s *PostPageService) GetPostListForIndex(ctx *gin.Context, page, limitNum, types int64, isByAdmin bool) model.PostListData {
	// 直接调用数据层
	return s.postDataService.GetPostListForIndex(ctx, page, limitNum, types, isByAdmin)
}

// GetPostListByKeyword 根据关键词获取文章列表（页面逻辑）
func (s *PostPageService) GetPostListByKeyword(ctx *gin.Context, keyWord, tagName string, typeId, page, limitNum int64, byAdmin bool) model.PostListData {
	// 直接调用数据层
	return s.postDataService.GetPostListByKeyword(ctx, keyWord, tagName, typeId, page, limitNum, byAdmin)
}
